item12-复制对象时要复制所有成员
item12-复制对象时要复制所有成员
当自己实现了拷贝构造函数、赋值运算符后,编译器不再检查拷贝行为是否完整,容易发生拷贝时遗漏成员变量。
当派生类继承基类后,实现的拷贝构造函数、赋值运算符可能只拷贝了派生类的成员,遗漏对基类成员变量的拷贝。
当为派生类写实现拷贝行为时,必须拷贝其基类的成员变量,但基类的成员变量往往是私有的,无法直接访问,所以
- 应该让派生类的拷贝构造函数调用相应基类的拷贝构造函数
- 应该让派生类的赋值运算符调用相应基类的赋值运算符
class B : private A {
public:
B(const B& rhs) : A(rhs){
...
}
B& operator=(const B& rhs){
...
A::operator(rhs);
...
}
}
总结
当编写 copying 函数时(拷贝构造函数、赋值运算符):
- 复制所有local成员变量
- 调用所有基类内适当的copying函数
不要尝试以某个copying函数实现另一个copying函数,当二者实现相似时,可以声明一个private的成员函数受copying函数调用